/**
 * @file oeuvre.c
 * @brief Fichier d'implémentation du module oeuvre.
 *
 * @author Rachid Delory , Florian Bernard, Mamadou Keita
 */

#include "oeuvre.h"

/* *********************************************************************

                 Fonctions relatives aux regroupement                      

********************************************************************* */

void init_Oeu(Oeuvre * oeuvre) 
{
  if (oeuvre)
    {
      oeuvre->id = 0 ;
      oeuvre->nbVisio = 0 ;
      oeuvre->titre = NULL ;
      oeuvre->type = 0 ;
      oeuvre->illustration = NULL ;
      oeuvre->commentaire = NULL ;
      oeuvre->lienMedia = NULL ;
      oeuvre->dateSortie = NULL ;
      oeuvre->pLabel = NULL ;
      oeuvre->public = AUCUN_PUB ;
      oeuvre->eLangue = creer_Ens();
      oeuvre->eGenre = creer_Ens();
      oeuvre->eCollaborateur = creer_Ens();
      oeuvre->media = NULL ;
      oeuvre->maj = 0;
      oeuvre->sup = 0;
    }
}

void liberer_Oeu(Oeuvre * oeuvre)
{
  if(oeuvre)
    {
      /*      int i,j;
       */
      oeuvre->id = 0;
      oeuvre->nbVisio = 0;
      if(oeuvre->titre != NULL)
	{
	  free(oeuvre->titre);
	  oeuvre->titre = NULL ;
	}
     
      setType_Oeu(oeuvre, AUCUN_OEU);
      if(oeuvre->illustration != NULL)
	{
	  free(oeuvre->illustration);
	  oeuvre->illustration = NULL;
	}
      if(oeuvre->commentaire != NULL)
	{
	  free(oeuvre->commentaire);
	  oeuvre->commentaire = NULL ;
	}
      if(oeuvre->lienMedia != NULL)
	{
	  free(oeuvre->lienMedia);
	  oeuvre->lienMedia = NULL ;
	}
      if(oeuvre->dateSortie != NULL)
	{
	  detruire_Dat(&(oeuvre->dateSortie));
	  oeuvre->dateSortie = NULL ; 
	}
      if(oeuvre->pLabel != NULL)
	{
	  free(oeuvre->pLabel);
	  oeuvre->pLabel = NULL ; 
	}
      oeuvre->public = AUCUN_PUB;

      detruire_Ens(&(oeuvre->eLangue), detruire_Lan);
      detruire_Ens(&(oeuvre->eGenre), detruire_Gen);
      detruire_Ens(&(oeuvre->eCollaborateur), detruire_Act);
    }
}

void * creer_Oeu()
{
  Oeuvre *oeuvre = malloc (sizeof (Oeuvre));
  if(oeuvre)
    init_Oeu(oeuvre);
  else
    {
      fprintf(stderr, "Mémoire insuffisante");
      exit(EXIT_FAILURE);
    }
  return oeuvre;
}

void detruire_Oeu(Oeuvre ** oeuvre)
{
  if(oeuvre)
    {
      liberer_Oeu((*oeuvre));
    }
  if((*oeuvre) != NULL)
    free((*oeuvre));
  (*oeuvre) = NULL;
}

void copier_Oeu(Oeuvre **dest, const Oeuvre *src)
{
  if((*dest))
    {
      if(src)
	{
	  (*dest)->id = src->id;
	  (*dest)->nbVisio = src->nbVisio;

	  copier_Uti(&((*dest)->titre), src->titre);
	  (*dest)->type = src->type;
	  copier_Uti(&((*dest)->illustration), src->illustration);
	  copier_Uti(&((*dest)->commentaire), src->commentaire);
	  copier_Uti(&((*dest)->lienMedia), src->lienMedia);
	  copier_Dat(&((*dest)->dateSortie), src->dateSortie);
	  copier_Lab(&((*dest)->pLabel), src->pLabel);
	  (*dest)->public =  src->public;
	  copier_Ens(&((*dest)->eLangue), src->eLangue, creer_Lan, detruire_Lan, copier_Lan);
	  copier_Ens(&((*dest)->eGenre), src->eGenre, creer_Gen, detruire_Gen, copier_Gen);
	  copier_Ens(&((*dest)->eCollaborateur), src->eCollaborateur, creer_Act, detruire_Act, copier_Act);
	  switch(getType_Oeu((*dest)))
	    {
	    case FILM_OEU:
	      copier_Fil((Film **)&((*dest)->media), src->media);
	      break;
	    case LIVRE_OEU:
	      copier_Liv((Livre **)&((*dest)->media), src->media);
	      break;
	    case MUSIQUE_OEU:
	      copier_Mus((Musique **)&((*dest)->media), src->media);
	      break;
	    default:
	      break;
	    }
	}
    }
}
/* ********************************************************************* 

           Accesseurs et Mutateurs de la structure sRegroupement             

********************************************************************* */

unsigned int getId_Oeu(const Oeuvre *pOeuvre)
{
  if(pOeuvre)
    return (pOeuvre->id);  
  return 0;    
}

void setId_Oeu(Oeuvre *pOeuvre, const unsigned int id) 
{
  if(pOeuvre)
    pOeuvre->id = id;
}

unsigned int getNbVisio_Oeu(const Oeuvre *pOeuvre) 
{
  if(pOeuvre)
    return (pOeuvre->nbVisio);
  return 0;      
}

void setNbVisio_Oeu(Oeuvre *pOeuvre, const int nbVisio) 
{
  if(pOeuvre)
    pOeuvre->nbVisio = nbVisio;
}

char *getTitre_Oeu(const Oeuvre *pOeuvre) 
{
  if(pOeuvre)
    return (pOeuvre->titre);      
  return NULL;
}

void setTitre_Oeu(Oeuvre *pOeuvre,const char * titre) 
{
  if(pOeuvre)
    {
      copier_Uti(&(pOeuvre->titre), titre);
    }
}

unsigned int getType_Oeu(const Oeuvre *pOeuvre) 
{
  if(pOeuvre)
    return (pOeuvre->type);      
  return 0;
}

void setType_Oeu(Oeuvre *pOeuvre, const unsigned int type) 
{
  if(pOeuvre)
    {
      if(pOeuvre->type == type)
	return;
      switch(pOeuvre->type)
	{
	case FILM_OEU:
	  detruire_Fil((Film **)&(pOeuvre->media));
	  break;
	case LIVRE_OEU:
	  detruire_Liv((Livre **)&(pOeuvre->media));
	  break;
	case MUSIQUE_OEU:
	  detruire_Mus((Musique **)&(pOeuvre->media));
	  break;
	default:
	  break;
	}
      pOeuvre->media = NULL;
      pOeuvre->type = type;
      switch(type)
	{
	case FILM_OEU:
	  pOeuvre->media = creer_Fil();
	  break;
	case MUSIQUE_OEU:
	  pOeuvre->media = creer_Mus();
	  break;
	case LIVRE_OEU:
	  pOeuvre->media = creer_Liv();
	  break;
	default:
	  break;
	}
    }

}

char * getIllustration_Oeu(const Oeuvre *pOeuvre) 
{
  if(pOeuvre)
    return (pOeuvre->illustration);      
  return NULL;
}

void setIllustration_Oeu(Oeuvre *oeuvre, const char *illustration) 
{
  if(oeuvre)
    {
      copier_Uti(&(oeuvre->illustration), illustration);
    }
}

char *getCommentaire_Oeu(const Oeuvre *pOeuvre) 
{
  if(pOeuvre)
    return (pOeuvre->commentaire);
  return NULL;
}

void setCommentaire_Oeu(Oeuvre *oeuvre, const char * commentaire) 
{
  if(oeuvre) 
    {
      copier_Uti(&(oeuvre->commentaire), commentaire);
    }
}

char * getLienMedia_Oeu(const Oeuvre *pOeuvre) 
{
  if(pOeuvre)
    return (pOeuvre->lienMedia);      
  return NULL;
}

void setLienMedia_Oeu(Oeuvre *oeuvre, const char * lien) 
{
  if(oeuvre) 
    {
      copier_Uti(&(oeuvre->lienMedia), lien);
    }
}

Date * getDateSortie_Oeu(const Oeuvre *pOeuvre) 
{
  if(pOeuvre)
    return (pOeuvre->dateSortie);
  return NULL;
}

void setDateSortie_Oeu(Oeuvre *pOeuvre, const Date * date) 
{
  if(pOeuvre)
    copier_Dat(&(pOeuvre->dateSortie), date);
}

Label * getLabel_Oeu(const Oeuvre *pOeuvre) 
{
  if(pOeuvre)
    return (pOeuvre->pLabel);
  return NULL;
}

void setLabel_Oeu(Oeuvre *pOeuvre, const Label *pLabel) 
{
  if(pOeuvre)
    copier_Lab(&(pOeuvre->pLabel), pLabel);
}

int  getPublic_Oeu(const Oeuvre *pOeuvre) 
{
  if(pOeuvre)
    return (pOeuvre->public);
  return TOUS_PUBLIC_PUB;
}

void setPublic_Oeu(Oeuvre *pOeuvre, const int public) 
{
  if(pOeuvre)
    pOeuvre->public = public;
}

void * getMedia_Oeu(const Oeuvre *pOeuvre) 
{
  if(pOeuvre)
    return (pOeuvre->media);
  return NULL;
}

void setMedia_Oeu(Oeuvre *pOeuvre, void * media, void (*copier)())
{
  if(pOeuvre)
    {
      copier(&(pOeuvre->media), media);
    }
}

Ensemble * getEnsembleGenre_Oeu(const Oeuvre *pOeuvre) 
{
  if(pOeuvre)
    return (pOeuvre->eGenre);
  return NULL;
}

void ajouterGenre_Oeu(Oeuvre *oeuvre, Genre *genre)
{
  if(oeuvre)
    {
      insert_Ens(oeuvre->eGenre, genre, creer_Gen, copier_Gen);
    }
}

Ensemble * getEnsembleLangue_Oeu(const Oeuvre *pOeuvre) 
{
  if(pOeuvre)
    return (pOeuvre->eLangue);      
  return NULL;
}

void ajouterLangue_Oeu(Oeuvre *oeuvre, Langue *langue)
{
  if(oeuvre)
    {
      insert_Ens(oeuvre->eLangue, langue, creer_Lan, copier_Lan);
    }
}

Ensemble * getEnsembleCollaborateur_Oeu(const Oeuvre *pOeuvre) 
{
  if(pOeuvre)
    return (pOeuvre->eCollaborateur);
  return NULL;
}


void ajouterCollaborateur_Oeu(Oeuvre *oeuvre, Activite *collaborateur)
{
  if(oeuvre)
    {
      insert_Ens(oeuvre->eCollaborateur, collaborateur, creer_Lan, copier_Lan);
    }
}

void setMaj_Oeu(Oeuvre *ptr, const char b)
{
  if(ptr)
    {
      ptr->maj = b;
      if(b == 1)
	ptr->sup = !b;
    }
}

char getMaj_Oeu(const Oeuvre *ptr)
{
  if(ptr)
    return ptr->maj;
  return 0;
}

void setSup_Oeu(Oeuvre *ptr, const char b)
{
  if(ptr)
    {
      ptr->sup = b;
      if(b == 1)
	ptr->maj = !b;
    }
}

char getSup_Oeu(const Oeuvre *ptr)
{
  if(ptr)
    return ptr->sup;
  return 0;
}

/* ********************************************************************* */
/*                                                                       */
/*                           Test de regression                          */
/*                                                                       */
/* ********************************************************************* */

void regression_Oeu() 
{

  printf("\tCréation d'une oeuvre : ");
  creer_Oeu();
  
}
